package com.hyt.it.ogt.ykcj.task;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hyt.it.ogt.ykcj.common.enums.TaskStatus;
import com.hyt.it.ogt.ykcj.common.utils.spring.SpringUtils;
import com.hyt.it.ogt.ykcj.domain.system.SysScheduledCron;
import com.hyt.it.ogt.ykcj.mapper.system.SysScheduledCronMapper;

/**
 * @Author chentb
 * @Date 2021/6/24 17:02
 */

public interface ScheduledOfTask extends Runnable{

    public Logger log = LoggerFactory.getLogger(com.hyt.it.ogt.ykcj.task.ScheduledOfTask.class);
    /**
     * 定时任务方法
     */
    void execute();
    /**
     * 实现控制定时任务启用或禁用的功能
     */
    @Override
    default void run() {
        SysScheduledCronMapper repository = SpringUtils.getBean(SysScheduledCronMapper.class);
        SysScheduledCron scheduledCron = repository.findByCronKey(this.getClass().getName());
        if (TaskStatus.PROCESSING.getCode() == scheduledCron.getStatus()) {
            // 任务正在处理中
            log.info("任务【{}】上次调度正在处理中",scheduledCron.getTaskExplain());
            return;
        }
        try {
            // 更新任务状态为处理中
            scheduledCron.setStatus(TaskStatus.PROCESSING.getCode());
            scheduledCron.setStartTime(new Date());
            repository.updateSysScheduledCron(scheduledCron);
            // 执行具体的任务逻辑
            execute();
            // 更新执行状态为成功
            scheduledCron.setStatus(TaskStatus.SUCCESS.getCode());
            scheduledCron.setStartTime(new Date());
            repository.updateSysScheduledCron(scheduledCron);
        }catch (Exception e){
            log.error("执行任务【{}】出现异常",scheduledCron.getTaskExplain(),e);
            // 更新执行状态为失败
            scheduledCron.setStatus(TaskStatus.FAIL.getCode());
            scheduledCron.setEndTime(new Date());
            repository.updateSysScheduledCron(scheduledCron);
        }
    }

}
